"""进程同步之：pipe（管道）
Pipe是两个进程间通信的工具。Pipe可以是单向(half-duplex)，也可以是双向(duplex)。通过mutiprocessing.Pipe(duplex=False)创建单向管道 (默认为双向)。一个进程从Pipe一端输入对象，然后被Pipe另一端的进程接收，单向管道只允许管道一端的进程输入，而双向管道则允许从两端输入。
Pipe的每个端口同时最多一个进程读写，否则会出现各种问题，可能造成corruption异常。Pipe对象建立的时候，返回一个含有两个元素的元组对象，每个元素代表Pipe的一端(Connection对象)。我们对Pipe的某一端调用send()方法来传送对象，在另一端使用recv()来接收。
"""
# encoding=utf-8
import multiprocessing as mp


def proc_1(pipe):
    pipe.send('hello')
    print('proc_1 received: %s' % pipe.recv())  # pipe.recv()会死等
    pipe.send("what is your name?")
    print('proc_1 received: %s' % pipe.recv())


def proc_2(pipe):
    print('proc_2 received: %s' % pipe.recv())  # pipe.recv()会死等
    pipe.send('hello, too')
    print('proc_2 received: %s' % pipe.recv())
    pipe.send("I don't tell you!")


if __name__ == '__main__':
    # 创建一个管道对象pipe
    pipe = mp.Pipe()
    print(len(pipe))
    print(type(pipe))
    # 将第一个pipe对象传给进程1
    p1 = mp.Process(target=proc_1, args=(pipe[0],))
    # 将第二个pipe对象传给进程2
    p2 = mp.Process(target=proc_2, args=(pipe[1],))
    p2.start()
    p1.start()
    p2.join()
    p1.join()
